/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author v3550
 */
public class ArtigoDAO {
   
    public ArtigoDAO() throws DAOException {
       try {
             Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        } catch (ClassNotFoundException ex) {
            throw new DAOException("JdbcOdbDriver not found!!");
        }
    }
    
    
    private static Connection getConnection() throws SQLException {
        //derbyDB sera o nome do diretorio criado localmente
        return DriverManager.getConnection("jdbc:derby:derbyDB");
    } 
    
    public ArtigoDTO gravar(ArtigoDTO c) throws DAOException {
       
        try {
            Connection con = getConnection();
            Statement sta = con.createStatement();
            String sql = "INSERT INTO ARTIGO_LEILAO ( ID_CATEGORIA, ID_USUARIO, DESCRICAO ," +
               " QUANTIDADE, DATA_INICIO, HORA_INICIO , " +
               " DATA_FIM, HORA_FIM, VALOR_BASE, VALOR_MAXIMO) VALUES ("
                    +  c.getCategoria() + ","
                    + c.getUsuario() +","
                    + "'"+c.getNome()+"',"
                    + c.getQtdItensVenda() +","
                    + "'" +c.getDataInicial() +"',"
                    + "'" + c.getHoraInicial() +"',"
                    + "'" + c.getDataFinal() + "',"
                    +  "'" +c.getHorafinal()+"',"
                    + c.getValorInicial() +","
                    +"'"+ c.getPoliticaVencedor()+"')";

           // System.out.println(sql);
            sta.executeUpdate(sql);
            if(setCodigo(c)) // recupera o id inserido.
            {
                //System.out.println(c.toString());
                sta.close();
                con.close();
                return c;
            }
        } catch (SQLException ex) {
            throw new DAOException(ex.getMessage());
        }
        return null;
    }
      public boolean fecharLeilao(int id) throws DAOException {
       
        try {
            Connection con = getConnection();
            Statement sta = con.createStatement();
            String sql = "UPDATE ARTIGO_LEILAO SET ATIVO ='N' WHERE ID = "+ id;

            if(sta.executeUpdate(sql) > 0) return true;
            
        } catch (SQLException ex) {
            throw new DAOException(ex.getMessage());
        }
        return false;
    }
    
    private boolean setCodigo(ArtigoDTO p) throws DAOException {
        try {
            Connection con = getConnection();
            PreparedStatement stmt = con.prepareStatement(
                    " SELECT ID FROM ARTIGO_LEILAO WHERE UCASE(DESCRICAO)= ?"
                    + " AND ID_CATEGORIA =? AND ID_USUARIO  = ? ");
            stmt.setString(1, p.getNome().toUpperCase());
            stmt.setInt(2, p.getCategoria());
            stmt.setInt(3, p.getUsuario());
            
            ResultSet resultado = stmt.executeQuery();
            if(resultado.next()) {
                int codigo = resultado.getInt("ID");
                p.setId(codigo);
                return true;
            }
            
        } catch (SQLException ex) {
            throw new DAOException("Falha ao adicionar. ->" + ex.getMessage());
        }
        return false;
    }
    
    public List<ArtigoDTO> getArtigos() throws DAOException {
          ArtigoDTO qualquer = null;
          List<ArtigoDTO> list = new LinkedList<ArtigoDTO>();

        try {
            Connection con = getConnection();
            Statement sta = con.createStatement();

            ResultSet res = sta.executeQuery("SELECT ID, ID_CATEGORIA, ID_USUARIO, DESCRICAO ," +
               " QUANTIDADE, DATA_INICIO, HORA_INICIO , " +
               " DATA_FIM, HORA_FIM, VALOR_BASE, VALOR_MAXIMO FROM ARTIGO_LEILAO ");
            
            while (res.next()) {
                qualquer = new ArtigoDTO();
                
                qualquer.setId(res.getInt("ID"));
                
                qualquer.setNome(res.getString("DESCRICAO"));
                qualquer.setCategoria(res.getInt("ID_CATEGORIA"));
                qualquer.setUsuario(res.getInt("ID_USUARIO"));
               
                qualquer.setDataInicial(res.getDate("DATA_INICIO"));
                qualquer.setDataFinal(res.getDate("DATA_FIM"));
                
                qualquer.setHoraInicial(res.getTime("HORA_INICIO"));
                qualquer.setHorafinal(res.getTime("HORA_FIM"));
                
                qualquer.setQtdItensVenda(res.getInt("QUANTIDADE"));
                qualquer.setValorInicial(res.getDouble("VALOR_BASE"));
                qualquer.setPoliticaVencedor(res.getString("VALOR_MAXIMO"));
                
                list.add(qualquer);
                
            }
            res.close();
            sta.close();
            con.close();
        } catch (Exception ex) {
            throw new DAOException(ex.getMessage());
        }

        return list;
    }
    
    public List<ArtigoDTO> getArtigosAberto() throws DAOException {
          ArtigoDTO qualquer = null;
          List<ArtigoDTO> list = new LinkedList<ArtigoDTO>();

        try {
            Connection con = getConnection();
            Statement sta = con.createStatement();

            ResultSet res = sta.executeQuery("SELECT ID, ID_CATEGORIA, ID_USUARIO, DESCRICAO ," +
               " QUANTIDADE, DATA_INICIO, HORA_INICIO , " +
               " DATA_FIM, HORA_FIM, VALOR_BASE, VALOR_MAXIMO FROM ARTIGO_LEILAO  "
             + " WHERE  ATIVO = 'S' AND ((CAST(DATA_FIM ||' '|| HORA_FIM AS TIMESTAMP)) > CURRENT_TIMESTAMP)  ");
            
            while (res.next()) {
                qualquer = new ArtigoDTO();
                
                qualquer.setId(res.getInt("ID"));
                
                qualquer.setNome(res.getString("DESCRICAO"));
                qualquer.setCategoria(res.getInt("ID_CATEGORIA"));
                qualquer.setUsuario(res.getInt("ID_USUARIO"));
               
                qualquer.setDataInicial(res.getDate("DATA_INICIO"));
                qualquer.setDataFinal(res.getDate("DATA_FIM"));
                
                qualquer.setHoraInicial(res.getTime("HORA_INICIO"));
                qualquer.setHorafinal(res.getTime("HORA_FIM"));
                
                qualquer.setQtdItensVenda(res.getInt("QUANTIDADE"));
                qualquer.setValorInicial(res.getDouble("VALOR_BASE"));
                qualquer.setPoliticaVencedor(res.getString("VALOR_MAXIMO"));
                
                list.add(qualquer);
                
            }
            res.close();
            sta.close();
            con.close();
        } catch (Exception ex) {
            throw new DAOException(ex.getMessage());
        }

        return list;
    }
    
    public boolean validaDataHoraLance(int a) throws DAOException
    {
        try {
            Connection con = getConnection();
            Statement sta = con.createStatement();

            ResultSet res = sta.executeQuery("SELECT ID, ID_CATEGORIA, ID_USUARIO, DESCRICAO ," +
               " QUANTIDADE, DATA_INICIO, HORA_INICIO , " +
               " DATA_FIM, HORA_FIM, VALOR_BASE, VALOR_MAXIMO FROM ARTIGO_LEILAO "
               + " WHERE ID =  " + a 
               + " AND ( CURRENT_TIMESTAMP < (CAST(DATA_FIM ||' '|| HORA_FIM AS TIMESTAMP))  )");
            
            if (res.next()) {
                return true;
            }
            res.close();
            sta.close();
            con.close();
        } catch (Exception ex) {
            throw new DAOException(ex.getMessage());
        } 
        
        return false;
    }
    
    public List<ArtigoDTO> getArtigosFechado() throws DAOException {
          ArtigoDTO qualquer = null;
          List<ArtigoDTO> list = new LinkedList<ArtigoDTO>();

        try {
            Connection con = getConnection();
            Statement sta = con.createStatement();

            ResultSet res = sta.executeQuery("SELECT ID, ID_CATEGORIA, ID_USUARIO, DESCRICAO ," +
               " QUANTIDADE, DATA_INICIO, HORA_INICIO , " +
               " DATA_FIM, HORA_FIM, VALOR_BASE, VALOR_MAXIMO FROM ARTIGO_LEILAO "
               + " WHERE ((ATIVO ='N') OR ((CAST(DATA_FIM ||' '|| HORA_FIM AS TIMESTAMP)) < CURRENT_TIMESTAMP)) ");
            
            while (res.next()) {
                qualquer = new ArtigoDTO();
                
                qualquer.setId(res.getInt("ID"));
                
                qualquer.setNome(res.getString("DESCRICAO"));
                qualquer.setCategoria(res.getInt("ID_CATEGORIA"));
                qualquer.setUsuario(res.getInt("ID_USUARIO"));
               
                qualquer.setDataInicial(res.getDate("DATA_INICIO"));
                qualquer.setDataFinal(res.getDate("DATA_FIM"));
                
                qualquer.setHoraInicial(res.getTime("HORA_INICIO"));
                qualquer.setHorafinal(res.getTime("HORA_FIM"));
                
                qualquer.setQtdItensVenda(res.getInt("QUANTIDADE"));
                qualquer.setValorInicial(res.getDouble("VALOR_BASE"));
                qualquer.setPoliticaVencedor(res.getString("VALOR_MAXIMO"));
                list.add(qualquer);
            }
            res.close();
            sta.close();
            con.close();
        } catch (Exception ex) {
            throw new DAOException(ex.getMessage());
        }

        return list;
    }
    
}
